SV.PRIVILEGE.MISSING 您所在的位置:网站首页 doprivileged block SV.PRIVILEGE.MISSING

SV.PRIVILEGE.MISSING

2024-07-15 06:23| 来源: 网络整理| 查看: 265

调用的方法不得在 doPrivileged 块内

软件未正确分配、修改、跟踪或检查参与者的权限,从而导致为该参与者创建非预期的控制范围。

漏洞与风险

与加载类相关的安全检查由类加载程序执行。因此,任何调用这些类加载方法之一的方法必须保证这些方法无法代表不受信任的代码行动。

在 doPrivileged 内使用这些方法会阻止将任何安全管理器检查应用到调用程序,从而阻止应用到执行堆栈。因此,不得在 doPrivileged 块中使用以下方法: 复制java.lang.Runtime.loadjava.lang.Runtime.loadLibraryjava.lang.System.loadjava.lang.System.loadLibraryjava.lang.reflect.Field.setAccessible() 漏洞代码示例 1

在以下示例中,我们会看到权限更改的证据。

复制 11 12 13 14 15 16 17 18 19 20 21 22  public class NoReturnNoException {           public void somemethod() {         AccessController.doPrivileged(new PrivilegedAction() {             public Void run() {                 // Privileged code goes here, for example:                  System.loadLibrary("awk");                 return null; // nothing to return             }         });     } } 复制 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28   public class NoReturnNoException {           class MyAction implements PrivilegedAction {         public Void run() {             // Privileged code goes here, for example:              System.loadLibrary("awt");             return null; // nothing to return         }     }           public void somemethod() {                      MyAction mya = new MyAction();                   // Become privileged:          AccessController.doPrivileged(mya);     } }

此代码不安全,因为它可以代表不受信任的代码来加载库。不受信任代码的类加载程序可以使用此代码来加载库,即使代码本身缺乏足够的权限来执行此操作。加载库之后,不受信任的代码可从库中调用本机方法(如果可访问这些方法),因为 doPrivileged 块会阻止将任何安全管理器检查应用到调用程序,从而阻止应用到执行堆栈。

此示例使用 lambda 表达式。

复制 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26  import java.security.*;   public class NoReturnNoException {           public void somemethod() {                   // Lambda expression         AccessController.doPrivileged((PrivilegedAction)             () -> {                 // Privileged code goes here, for example:                  System.loadLibrary("awt");                 return null; // nothing to return             }         );     } }

不得在 doPrivileged 块中使用 loadLibrary() 方法,以免权限覆盖。

修正代码示例 1 复制 11 12 13 14 15 16 17  import java.security.*;   public class NoReturnNoException {     public void somemethod() {                    System.loadLibrary("awt");     } }

在此示例中,Klocwork 不再报告缺陷,因为 doPrivileged 块中未使用 loadLibrary() 方法。

漏洞代码示例 2 复制 11 12 13 14 15 16 17  AccessController.doPrivileged(new PrivilegedAction() {     @Override     public Object run() {         field.setAccessible(true);  // {     field.setAccessible(true);  //


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有